package com.xjaq.dify.entity;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel("Dify请求参数")
public class DifyRequest {

    /**
     * 输入提问内容
     */
    @ApiModelProperty(value = "输入提问内容")
    private String query;

    /**
     * (选填)允许传入 App 定义的各变量值
     */
    @ApiModelProperty(value = "(选填)允许传入 App 定义的各变量值")
    private Map<String, Object> inputs = new HashMap<>(); // 设置默认空Map

    /**
     * 回复模式：streaming流式模式,blocking阻塞模式
     */
    @JsonProperty("response_mode")
    @ApiModelProperty(value = "回复模式：streaming流式模式,blocking阻塞模式")
    private String responseMode = "streaming";

    /**
     * 用户标识，用于定义终端用户的身份，方便检索、统计。 由开发者定义规则，需保证用户标识在应用内唯一。
     */
    @ApiModelProperty(value = "用户标识，用于定义终端用户的身份，方便检索、统计。 由开发者定义规则，需保证用户标识在应用内唯一。")
    private String user = "";

    /**
     * （选填）会话id，需要基于之前的聊天记录继续对话，必须传之前消息的 conversation_id
     */
    @JsonProperty("conversation_id")
    @ApiModelProperty(value = "（选填）会话id，需要基于之前的聊天记录继续对话，必须传之前消息的 conversation_id")
    private String conversationId;

    /**
     * （选填）自动生成标题，默认 true。 可通过调用会话重命名接口并设置 auto_generate 为 true 实现异步生成标题
     */
    @JsonProperty("auto_generate_name")
    @ApiModelProperty(value = "（选填）自动生成标题，默认 true。 可通过调用会话重命名接口并设置 auto_generate 为 true 实现异步生成标题")
    private Boolean autoGenerateName;

    /**
     * 链路追踪ID
     */
    @JsonProperty("trace_id")
    @ApiModelProperty(value = "（选填）链路追踪ID")
    private String traceId;

    /**
     * 文件列表，适用于传入文件结合文本理解并回答问题
     */
    @ApiModelProperty(value = "文件列表，适用于传入文件结合文本理解并回答问题")
    private List<UploadFile> files;
    
    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    @ApiModel("上传文件信息")
    public static class UploadFile {
        /**
         * 支持类型：document, image, audio, video, custom
         */
        @ApiModelProperty(value = "支持类型：document, image, audio, video, custom")
        private String type;

        /**
         * 传递方式: remote_url, local_file
         */
        @JsonProperty("transfer_method")
        @ApiModelProperty(value = "传递方式: remote_url, local_file")
        private String transferMethod;

        /**
         * 图片URL
         */
        @ApiModelProperty(value = "图片URL。（仅当传递方式为 remote_url 时）")
        private String url;

        /**
         * 上传文件 ID。（仅当传递方式为 local_file 时）
         */
        @JsonProperty("upload_file_id")
        @ApiModelProperty(value = "上传文件 ID。（仅当传递方式为 local_file 时）")
        private String uploadFileId;
    }
}